package com.jianglin.state2.model.core;


import com.jianglin.state2.util.BeanUtil;

import java.lang.reflect.ParameterizedType;

/**
 * 基本输入/输出对象方法
 * Base Input/Output Method
 *
 * @param <T> 需要转换到的目标类
 * @author violetfreesia
 * @since 2020-12-6
 */
@SuppressWarnings("unchecked")
public abstract class Biom<T> {
    /**
     * 将当前对象转为T的对象
     *
     * @param <S> Biom的子类
     * @return 返回T的对象
     */
    public <S extends Biom<T>> T convertOut() {
        // 获得子类的Class
        Class<S> clazz = (Class<S>) this.getClass();
        // 获得子类的父类的泛型参数(就是这里这个T)
        ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass();
        // 获得子类第一个实际泛型参数的Class（T.class）
        Class<T> tClass = (Class<T>) pt.getActualTypeArguments()[0];
        return BeanUtil.convert((S) this, clazz, tClass);
    }

    /**
     * 将T对象转换为当前对象
     *
     * @param inObject T对象
     * @param <S>      Biom的子类
     * @return 返回子类对象
     */
    protected <S extends Biom<T>> S superConvertIn(T inObject) {
        // 获得子类的Class
        Class<S> clazz = (Class<S>) this.getClass();
        // 获得子类的父类的泛型参数(就是这里这个T)
        ParameterizedType pt = (ParameterizedType) clazz.getGenericSuperclass();
        // 获得子类第一个实际泛型参数的Class（T.class）
        Class<T> tClass = (Class<T>) pt.getActualTypeArguments()[0];
        return BeanUtil.convert(inObject, tClass, clazz);
    }
}
